import 'package:get/get.dart';
import 'package:get/get_state_manager/src/simple/get_controllers.dart';
import 'package:hive/hive.dart';
import 'package:todo/models/task_model.dart';

class TaskController extends GetxController {
  // 定义一个名为 `taskList` 的可观察列表，用于存储任务数据
  // `RxList` 是 GetX 框架中的一个类，用于表示可观察的列表，当列表中的数据发生变化时，会自动通知相关的观察者
  var taskList = <Task>[].obs;

  @override
  void onInit() {
    // 重写 `onInit` 方法，用于在控制器初始化时执行一些操作，例如：加载数据、初始化变量等
    super.onInit(); // 调用父类的 `onInit` 方法，确保父类的初始化逻辑也被执行
    openBox(); // 调用 `openBox` 方法，打开名为 'todoTasks' 的 Hive 盒子，用于存储任务数据
  }

  void openBox() async {
    // 定义一个名为 `openBox` 的异步方法，用于打开 Hive 盒子，用于存储任务数据
    var box = await Hive.openBox<Task>(
      'todoTasks',
    ); // 打开名为 'todoTasks' 的 Hive 盒子，用于存储任务数据，返回一个 `Box` 对象，用于操作 Hive 盒子中的数据
    taskList.addAll(
      box.values,
    ); // 将 Hive 盒子中的所有任务数据添加到 `taskList` 列表中，以便在应用程序中显示这些任务数据
  }

  void addTask(Task task) async {
    // 定义一个名为 `addTask` 的异步方法，用于添加一个新的任务到 Hive 盒子中，需要传入一个 `Task` 对象，用于表示要添加的任务数据
    var box = Hive.box<Task>(
      'todoTasks',
    ); // 打开名为 'todoTasks' 的 Hive 盒子，用于存储任务数据，返回一个 `Box` 对象，用于操作 Hive 盒子中的数据
    await box.add(task); // 将传入的 `Task` 对象添加到 Hive 盒子中，以便在应用程序中显示这些任务数据
    taskList.add(task); // 将传入的 `Task` 对象添加到 `taskList` 列表中，以便在应用程序中显示这些任务数据
  }

  void deleteTask(int index) {
    // 定义一个名为 `deleteTask` 的方法，用于删除一个任务从 Hive 盒子中，需要传入一个 `Task` 对象，用于表示要删除的任务数据
    var box = Hive.box<Task>('todoTasks');
    box.delete(index); // 将传入的 `Task` 对象从 Hive 盒子中删除，以便在应用程序中不再显示这些任务数据
    taskList.removeAt(
      index,
    ); // 将传入的 `Task` 对象从 `taskList` 列表中删除，以便在应用程序中不再显示这些任务数据
  }

  void updateTask(int index, Task task) {
    // 定义一个名为 `updateTask` 的方法，用于更新一个任务从 Hive 盒子中，需要传入一个 `Task` 对象，用于表示要更新的任务数据
    var box = Hive.box<Task>('todoTasks');
    box.put(index, task); // 将传入的 `Task` 对象更新到 Hive 盒子中，以便在应用程序中显示这些任务数据
    taskList[index] = task; // 将传入的 `Task` 对象更新到 `taskList` 列表中，以便在应用程序中显示这些任务数据
  }

  void toggleTaskCompletion(int index) async {
    taskList[index].isCompleted = !taskList[index].isCompleted;
    taskList.refresh(); // 刷新 `taskList` 列表，以便在应用程序中显示这些任务数据
  }
}
